{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "c8823310",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "间隔  620\n",
      "90% x轴坐标: 684860\n",
      "50% x轴坐标: 100820\n",
      "95% x轴坐标: 1043840\n",
      "99% x轴坐标: 1520000\n",
      "间隔  619\n",
      "90% x轴坐标: 497438\n",
      "50% x轴坐标: 100659\n",
      "95% x轴坐标: 728944\n",
      "99% x轴坐标: 1094154\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#完整cdf\n",
    "import numpy as np\n",
    "import seaborn as sns\n",
    "import sys\n",
    "from openpyxl import Workbook\n",
    "from openpyxl.utils import get_column_letter\n",
    "import pandas as pd\n",
    "import scipy\n",
    "import os\n",
    "import sys\n",
    "import matplotlib.pyplot as plt\n",
    "from pylab import * \n",
    "import math\n",
    "from numpy import cumsum\n",
    "\n",
    "%matplotlib inline\n",
    "\n",
    "#数据输入\n",
    "def get_trace_reference(filename):\n",
    "    \n",
    "    file_base = open(filename)\n",
    "    \n",
    "    flag=0\n",
    "    \n",
    "    base_list=[]\n",
    "    \n",
    "    while 1:\n",
    "        \n",
    "        base_lines = file_base.readlines(100000)\n",
    "             \n",
    "        if (not base_lines):\n",
    "            \n",
    "            break \n",
    "            \n",
    "        for base_line in base_lines:\n",
    "\n",
    "            if str(base_line).startswith(\"      arrive\"):\n",
    "\n",
    "                flag=1\n",
    "                \n",
    "                continue\n",
    "\n",
    "            if str(base_line).startswith(\"the 0 channel,\"):\n",
    "\n",
    "                flag=0\n",
    "                \n",
    "            if(flag==1):\n",
    "                \n",
    "                if(len(base_line.split())!=7):\n",
    "                    \n",
    "                    print(\"error\\n\")\n",
    "                    \n",
    "                    print(base_line.split(),len(base_line.split()))\n",
    "                    \n",
    "                if(int(base_line.split()[3])==1):\n",
    "                    \n",
    "                    base_list.append( int(base_line.split()[6]))\n",
    "                 \n",
    "\n",
    "    file_base.close()\n",
    "    \n",
    "    return base_list\n",
    "\n",
    "def get_hist(latencys):\n",
    "    \n",
    "    #分割为1000份\n",
    "    max_latency=max(latencys)\n",
    "    \n",
    "    min_latency=min(latencys)\n",
    "    \n",
    "    granularity=1000000\n",
    "    \n",
    "    bins= math.ceil( (max_latency-min_latency)/granularity)  #ceil() 函数返回数字的上入整数。\n",
    "    \n",
    "    print(\"间隔 \",bins)\n",
    "    counters=[0 for i in range(granularity)]\n",
    "    \n",
    "    \n",
    "    for item in latencys:\n",
    "        \n",
    "        i= math.ceil( (item-min_latency)/bins)\n",
    "        \n",
    "        if(i<0 or i>(granularity-1)):\n",
    "            \n",
    "            print(\"overflow:\",i)\n",
    "        \n",
    "        if(i==granularity):\n",
    "            \n",
    "            i=i-1\n",
    "            \n",
    "        if(i==granularity+1):\n",
    "            \n",
    "            i=i-2\n",
    "            \n",
    "            \n",
    "        counters[i] = counters[i]+1\n",
    "    \n",
    "    sums=sum(counters)\n",
    "    \n",
    "    probability_counters= list(map(lambda x: x*1.0/sums, counters))\n",
    "    \n",
    "    #print(probability_counters,sum(probability_counters))\n",
    "    \n",
    "    probability_counters=cumsum(probability_counters)\n",
    "    \n",
    "    return probability_counters,[ (min_latency+i*bins) for i in range(granularity)]\n",
    "\n",
    "plt.rc('font',family='Times New Roman')\n",
    "mpl.rcParams['axes.unicode_minus'] = False #解决保存图像是负号'-'显示为方块的问题\n",
    "plt.rcParams['xtick.direction'] = 'in'\n",
    "plt.rcParams['ytick.direction'] = 'in'\n",
    "tick_params(direction='in')\n",
    "ax = plt.gca()\n",
    "ax.spines['right'].set_color('none') \n",
    "ax.spines['top'].set_color('none')    \n",
    "\n",
    "base = get_trace_reference(\"result/base/1/DPROJ_1_out\")\n",
    "gc = get_trace_reference(\"result/Copy/1/DPROJ_1_out\")\n",
    "\n",
    "ax=plt.subplot(1,2,1)\n",
    "y,x=get_hist(base)\n",
    "\n",
    "plt.plot(x,y,'b--',label=\"base\")\n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.9)<0.01 or  j>0.9):\n",
    "        \n",
    "        print(\"90% x轴坐标:\",i)\n",
    "        \n",
    "        break\n",
    "\n",
    "\n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.5)<0.01 or  j>0.5):\n",
    "        \n",
    "        print(\"50% x轴坐标:\",i)\n",
    "        \n",
    "        label=i\n",
    "        \n",
    "        break\n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.95)<0.01 or  j>0.95):\n",
    "        \n",
    "        print(\"95% x轴坐标:\",i)\n",
    "        \n",
    "        label=i\n",
    "        \n",
    "        break        \n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.99)<0.01 or  j>0.99):\n",
    "        \n",
    "        print(\"99% x轴坐标:\",i)\n",
    "        \n",
    "        label=i\n",
    "        \n",
    "        break  \n",
    "plt.legend(loc='lower center') \n",
    "\n",
    "plt.ylabel(\"CDF\")\n",
    "\n",
    "\n",
    "ax2=plt.subplot(1,2,2) #两行两列,这是第二个图\n",
    "\n",
    "ax2.tick_params(axis=\"y\",pad=0)\n",
    "\n",
    "y,x=get_hist(gc)\n",
    "\n",
    "plt.plot(x,y,'r--',label=\"gc\")\n",
    "\n",
    "\n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.9)<0.01 or  j>0.9):\n",
    "        \n",
    "        print(\"90% x轴坐标:\",i)\n",
    "        \n",
    "        label=i\n",
    "        \n",
    "        break       \n",
    "\n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.5)<0.01 or  j>0.5):\n",
    "        \n",
    "        print(\"50% x轴坐标:\",i)\n",
    "        \n",
    "        label=i\n",
    "        \n",
    "        break\n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.95)<0.01 or  j>0.95):\n",
    "        \n",
    "        print(\"95% x轴坐标:\",i)\n",
    "        \n",
    "        label=i\n",
    "        \n",
    "        break        \n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.99)<0.01 or  j>0.99):\n",
    "        \n",
    "        print(\"99% x轴坐标:\",i)\n",
    "        \n",
    "        label=i\n",
    "        \n",
    "        break         \n",
    "\n",
    "\n",
    "plt.legend(loc = 'lower center') \n",
    "\n",
    "plt.suptitle(\"read latency of requests(unit:ms)\",y=0.05) \n",
    "\n",
    "plt.tight_layout()\n",
    "\n",
    "plt.savefig(\"readlatencycdf.pdf\", bbox_inches = 'tight')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "09ade280",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "间隔  6229\n",
      "90% x轴坐标: 7837910\n",
      "50% x轴坐标: 1384666\n",
      "95% x轴坐标: 41518113\n",
      "99% x轴坐标: 290516159\n",
      "间隔  2712\n",
      "90% x轴坐标: 7231723\n",
      "50% x轴坐标: 1376515\n",
      "95% x轴坐标: 11869243\n",
      "99% x轴坐标: 222182131\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import seaborn as sns\n",
    "import sys\n",
    "from openpyxl import Workbook\n",
    "from openpyxl.utils import get_column_letter\n",
    "import pandas as pd\n",
    "import scipy\n",
    "import os\n",
    "import sys\n",
    "import matplotlib.pyplot as plt\n",
    "from pylab import * \n",
    "import math\n",
    "from numpy import cumsum\n",
    "\n",
    "%matplotlib inline\n",
    "\n",
    "#数据输入\n",
    "def get_trace_reference(filename):\n",
    "    \n",
    "    file_base = open(filename)\n",
    "    \n",
    "    flag=0\n",
    "    \n",
    "    base_list=[]\n",
    "    \n",
    "    while 1:\n",
    "        \n",
    "        base_lines = file_base.readlines(100000)\n",
    "             \n",
    "        if (not base_lines):\n",
    "            \n",
    "            break \n",
    "            \n",
    "        for base_line in base_lines:\n",
    "\n",
    "            if str(base_line).startswith(\"      arrive\"):\n",
    "\n",
    "                flag=1\n",
    "                \n",
    "                continue\n",
    "\n",
    "            if str(base_line).startswith(\"the 0 channel,\"):\n",
    "\n",
    "                flag=0\n",
    "                \n",
    "            if(flag==1):\n",
    "                \n",
    "                if(len(base_line.split())!=7):\n",
    "                    \n",
    "                    print(\"error\\n\")\n",
    "                    \n",
    "                    print(base_line.split(),len(base_line.split()))\n",
    "                    \n",
    "                if(int(base_line.split()[3])==0):\n",
    "                    \n",
    "                    base_list.append( int(base_line.split()[6]))\n",
    "                 \n",
    "\n",
    "    file_base.close()\n",
    "    \n",
    "    return base_list\n",
    "\n",
    "def get_hist(latencys):\n",
    "    \n",
    "    #分割为1000份\n",
    "    max_latency=max(latencys)\n",
    "    \n",
    "    min_latency=min(latencys)\n",
    "    \n",
    "    granularity=1000000\n",
    "    \n",
    "    bins= math.ceil( (max_latency-min_latency)/granularity)  #ceil() 函数返回数字的上入整数。\n",
    "    \n",
    "    print(\"间隔 \",bins)\n",
    "    counters=[0 for i in range(granularity)]\n",
    "    \n",
    "    \n",
    "    for item in latencys:\n",
    "        \n",
    "        i= math.ceil( (item-min_latency)/bins)\n",
    "        \n",
    "        if(i<0 or i>(granularity-1)):\n",
    "            \n",
    "            print(\"overflow:\",i)\n",
    "        \n",
    "        if(i==granularity):\n",
    "            \n",
    "            i=i-1\n",
    "            \n",
    "        if(i==granularity+1):\n",
    "            \n",
    "            i=i-2\n",
    "            \n",
    "            \n",
    "        counters[i] = counters[i]+1\n",
    "    \n",
    "    sums=sum(counters)\n",
    "    \n",
    "    probability_counters= list(map(lambda x: x*1.0/sums, counters))\n",
    "    \n",
    "    #print(probability_counters,sum(probability_counters))\n",
    "    \n",
    "    probability_counters=cumsum(probability_counters)\n",
    "    \n",
    "    return probability_counters,[ (min_latency+i*bins) for i in range(granularity)]\n",
    "\n",
    "plt.rc('font',family='Times New Roman')\n",
    "mpl.rcParams['axes.unicode_minus'] = False #解决保存图像是负号'-'显示为方块的问题\n",
    "plt.rcParams['xtick.direction'] = 'in'\n",
    "plt.rcParams['ytick.direction'] = 'in'\n",
    "tick_params(direction='in')\n",
    "ax = plt.gca()\n",
    "ax.spines['right'].set_color('none') \n",
    "ax.spines['top'].set_color('none')    \n",
    "\n",
    "base = get_trace_reference(\"HM_0_out_base\")\n",
    "gc = get_trace_reference(\"HM_0_out_gc\")\n",
    "\n",
    "ax=plt.subplot(1,2,1)\n",
    "y,x=get_hist(base)\n",
    "\n",
    "plt.plot(x,y,'b--',label=\"base\")\n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.9)<0.01 or  j>0.9):\n",
    "        \n",
    "        print(\"90% x轴坐标:\",i)\n",
    "        \n",
    "        break\n",
    "\n",
    "\n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.5)<0.01 or  j>0.5):\n",
    "        \n",
    "        print(\"50% x轴坐标:\",i)\n",
    "        \n",
    "        label=i\n",
    "        \n",
    "        break\n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.95)<0.01 or  j>0.95):\n",
    "        \n",
    "        print(\"95% x轴坐标:\",i)\n",
    "        \n",
    "        label=i\n",
    "        \n",
    "        break        \n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.99)<0.01 or  j>0.99):\n",
    "        \n",
    "        print(\"99% x轴坐标:\",i)\n",
    "        \n",
    "        label=i\n",
    "        \n",
    "        break  \n",
    "plt.legend(loc='lower center') \n",
    "\n",
    "plt.ylabel(\"CDF\")\n",
    "\n",
    "\n",
    "ax2=plt.subplot(1,2,2) #两行两列,这是第二个图\n",
    "\n",
    "ax2.tick_params(axis=\"y\",pad=0)\n",
    "\n",
    "y,x=get_hist(gc)\n",
    "\n",
    "plt.plot(x,y,'r--',label=\"gc\")\n",
    "\n",
    "\n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.9)<0.01 or  j>0.9):\n",
    "        \n",
    "        print(\"90% x轴坐标:\",i)\n",
    "        \n",
    "        label=i\n",
    "        \n",
    "        break       \n",
    "\n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.5)<0.01 or  j>0.5):\n",
    "        \n",
    "        print(\"50% x轴坐标:\",i)\n",
    "        \n",
    "        label=i\n",
    "        \n",
    "        break\n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.95)<0.01 or  j>0.95):\n",
    "        \n",
    "        print(\"95% x轴坐标:\",i)\n",
    "        \n",
    "        label=i\n",
    "        \n",
    "        break        \n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.99)<0.01 or  j>0.99):\n",
    "        \n",
    "        print(\"99% x轴坐标:\",i)\n",
    "        \n",
    "        label=i\n",
    "        \n",
    "        break         \n",
    "\n",
    "\n",
    "plt.legend(loc = 'lower center') \n",
    "\n",
    "plt.suptitle(\"write latency of requests(unit:ms)\",y=0.05) \n",
    "\n",
    "plt.tight_layout()\n",
    "\n",
    "plt.savefig(\"readlatencycdf.pdf\", bbox_inches = 'tight')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "d0b6f271",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "间隔  863\n",
      "50% x轴坐标: 24.877754\n",
      "90% x轴坐标: 100.964149\n",
      "95% x轴坐标: 246.9639\n",
      "99% x轴坐标: 767.960452\n",
      "间隔  861\n",
      "50% x轴坐标: 24.40998\n",
      "90% x轴坐标: 111.718824\n",
      "95% x轴坐标: 261.358902\n",
      "99% x轴坐标: 771.196608\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:205: UserWarning: Glyph 20889 (\\N{CJK UNIFIED IDEOGRAPH-5199}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:205: UserWarning: Glyph 35831 (\\N{CJK UNIFIED IDEOGRAPH-8BF7}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:205: UserWarning: Glyph 27714 (\\N{CJK UNIFIED IDEOGRAPH-6C42}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:205: UserWarning: Glyph 24310 (\\N{CJK UNIFIED IDEOGRAPH-5EF6}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:205: UserWarning: Glyph 36831 (\\N{CJK UNIFIED IDEOGRAPH-8FDF}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:205: UserWarning: Glyph 21333 (\\N{CJK UNIFIED IDEOGRAPH-5355}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:205: UserWarning: Glyph 20301 (\\N{CJK UNIFIED IDEOGRAPH-4F4D}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:205: UserWarning: Glyph 65306 (\\N{FULLWIDTH COLON}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:205: UserWarning: Glyph 27627 (\\N{CJK UNIFIED IDEOGRAPH-6BEB}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:205: UserWarning: Glyph 31186 (\\N{CJK UNIFIED IDEOGRAPH-79D2}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:207: UserWarning: Glyph 20889 (\\N{CJK UNIFIED IDEOGRAPH-5199}) missing from current font.\n",
      "  plt.savefig(\"write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:207: UserWarning: Glyph 35831 (\\N{CJK UNIFIED IDEOGRAPH-8BF7}) missing from current font.\n",
      "  plt.savefig(\"write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:207: UserWarning: Glyph 27714 (\\N{CJK UNIFIED IDEOGRAPH-6C42}) missing from current font.\n",
      "  plt.savefig(\"write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:207: UserWarning: Glyph 24310 (\\N{CJK UNIFIED IDEOGRAPH-5EF6}) missing from current font.\n",
      "  plt.savefig(\"write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:207: UserWarning: Glyph 36831 (\\N{CJK UNIFIED IDEOGRAPH-8FDF}) missing from current font.\n",
      "  plt.savefig(\"write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:207: UserWarning: Glyph 21333 (\\N{CJK UNIFIED IDEOGRAPH-5355}) missing from current font.\n",
      "  plt.savefig(\"write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:207: UserWarning: Glyph 20301 (\\N{CJK UNIFIED IDEOGRAPH-4F4D}) missing from current font.\n",
      "  plt.savefig(\"write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:207: UserWarning: Glyph 65306 (\\N{FULLWIDTH COLON}) missing from current font.\n",
      "  plt.savefig(\"write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:207: UserWarning: Glyph 27627 (\\N{CJK UNIFIED IDEOGRAPH-6BEB}) missing from current font.\n",
      "  plt.savefig(\"write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:207: UserWarning: Glyph 31186 (\\N{CJK UNIFIED IDEOGRAPH-79D2}) missing from current font.\n",
      "  plt.savefig(\"write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:207: UserWarning: Glyph 20889 (\\N{CJK UNIFIED IDEOGRAPH-5199}) missing from current font.\n",
      "  plt.savefig(\"write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:207: UserWarning: Glyph 35831 (\\N{CJK UNIFIED IDEOGRAPH-8BF7}) missing from current font.\n",
      "  plt.savefig(\"write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:207: UserWarning: Glyph 27714 (\\N{CJK UNIFIED IDEOGRAPH-6C42}) missing from current font.\n",
      "  plt.savefig(\"write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:207: UserWarning: Glyph 24310 (\\N{CJK UNIFIED IDEOGRAPH-5EF6}) missing from current font.\n",
      "  plt.savefig(\"write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:207: UserWarning: Glyph 36831 (\\N{CJK UNIFIED IDEOGRAPH-8FDF}) missing from current font.\n",
      "  plt.savefig(\"write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:207: UserWarning: Glyph 21333 (\\N{CJK UNIFIED IDEOGRAPH-5355}) missing from current font.\n",
      "  plt.savefig(\"write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:207: UserWarning: Glyph 20301 (\\N{CJK UNIFIED IDEOGRAPH-4F4D}) missing from current font.\n",
      "  plt.savefig(\"write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:207: UserWarning: Glyph 65306 (\\N{FULLWIDTH COLON}) missing from current font.\n",
      "  plt.savefig(\"write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:207: UserWarning: Glyph 27627 (\\N{CJK UNIFIED IDEOGRAPH-6BEB}) missing from current font.\n",
      "  plt.savefig(\"write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3668314375.py:207: UserWarning: Glyph 31186 (\\N{CJK UNIFIED IDEOGRAPH-79D2}) missing from current font.\n",
      "  plt.savefig(\"write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 20889 (\\N{CJK UNIFIED IDEOGRAPH-5199}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 35831 (\\N{CJK UNIFIED IDEOGRAPH-8BF7}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 27714 (\\N{CJK UNIFIED IDEOGRAPH-6C42}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 24310 (\\N{CJK UNIFIED IDEOGRAPH-5EF6}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 36831 (\\N{CJK UNIFIED IDEOGRAPH-8FDF}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 21333 (\\N{CJK UNIFIED IDEOGRAPH-5355}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 20301 (\\N{CJK UNIFIED IDEOGRAPH-4F4D}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 65306 (\\N{FULLWIDTH COLON}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 27627 (\\N{CJK UNIFIED IDEOGRAPH-6BEB}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 31186 (\\N{CJK UNIFIED IDEOGRAPH-79D2}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "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MGAA69evZ8SIEbz++uvsuuuu5XLtImWhBFWC2bN9ku0ll2ze3q6dL7FULnMVv/gCnn7atwv/pbz33l5JVpMh01L//v2ZP38+b731FoMHD+bDDz+ka9eufPvtt3z33Xf88MMPrF69mj59+jB79mz69+9PRkYGBx10ELNmzWJZ0a59ETVq1KBZs2aYGa1ateLNN9/k/vvvZ/369YwZM4YaNWqwYMECsrKyaNq0Kd9//z0HFa3LJZIgSlDF9OjhFR8KdekCt9/upYn22aecfuSNN+Cyy3z7wAO9SN8pp3iBPiWnhNqenk55u/baa8nIyKB9+/Z07NiRd955h76RAsAbN27kj3/8I126dOGYY45h0KBBTJ8+nUsuuYQTTzyR008/nYKCgq2ee+dIV3+nnXZizz33BKBatWrk5eUxffp0mjRpwumnn17qeUQqkm5MR0ycCK1bR5PTM894T6pfP2jevJyS0wcf+GCHwuR0++1edXz6dO9NqSqEAK1atWLlypVcddVVdO3alTp16mBmzJw5k4EDB3LTTTfx9NNP06JFC3r37s3GjRsZM2YMq1at2uJcy5YtY0Yple1btGjBc889x9q1a5k5cybff/99vC5NZLuoBxXxwAM+YO600+Chh+DII+PwA716+Xa7dvDaa9CwYTn/iFRGEydOJDc3l6eeeopatWrx2Wef8cILL/DWW29x6aWXUrNmTT766CMaN27Mm2++Sf369bngggs48sgjGT58OC1atKBXr14cdthhjB8/npycHOrWrcv69esZNWoUH330EdOmTaN69eosXryYuXPnMm/ePGbOnMmKFSvo3bs377//Pvvvvz/XX389d6nosCSJYIWlD5JcVlaWTZkyJS7nNvPBD9Wrw++/l/PJly6F88+HcZFV7GfM8Nt6kjRmzJihZy4x0J+TxEsIIcfMsoq3qwcFjBrl7xdeWM4nHjrUJ0wBZGTA6NFKTiIiMdIzKODkk/39xhvL6YRffOH3CguT01//6hNvW7cupx8QEUl9ad+DKhzpfcYZ0KpVGU+2eLFPrh0+3PerV4d3340mKhERiVnaJ6ibb/b3N94o44kKCqB+/ej++PFw3HFlPKmISPpK61t8jz/u76edBrVq7eBJliyB//wnOkS8fXuvi6TkJCJSJmnbg5o4EW67zbcjcyG3X9FBEAAHHwwff6wlMUREykHa9qBuucXfhw2Dpk134ASffRZNTt26ecabOtVXvBURkTJLyx7Ut9/6QLu994aOHbfjwEWLvMr4m296MgK4/37o2TMucUp6GDduHKeeeip9+/bloosu2qJQa7du3ejTp882V7V99913mTRpEs2bN2fNmjXMmDGDF198EYAJEybw/vvvc+CBB7Jx40Y+/PBDPvroo7hek0h5SMsEdcEF/v7CC9tx0MMPw513RverV4fPP/eFBUXKoHC5jQsvvHCL5PTDDz/w9ttvc9ZZZ3HqqaeWePwnn3zCoEGDNlueo3fv3gDMmjWLbt26MX78+E31+EoqiSSSjNIuQb33HsyaBfvvD6Wu3/bAA15pfNky+Plnb3vySbjpJn/OpEUEU08yrLdRxODBg3n++efp27fvVhPUPffcw+OFI34isrOzAV9J9+yzz96UnAC6du26Q7GIVLS0ewbVrZu/v/baVr6wYgVkZ/uk2l69fEXCY4+FP/7Rq8d27+6LQCk5SZytX7+enXbaiXPPPZf//ve//Fz4j6Ripk2bRv0iUxxycnK47bbbmDRpErNmzdrsM4DddtstrnGLlJe49qBCCLcAS4GaZvZskfYOQHNgf2CAmU0t8tnLwGtm9nl5x3PPPb5c+4knbqWow6JF0KBBdL9VKx/ip9t46SOR620U88EHH5CXl8drr71Gy5Ytefnll+nZsyfDhg3bVND1zTffpGnTpsyePZsDDjgA8GroZ555Js8//zwNGzZkyZIlibwMkR1nZnF5AW2AByPbvYBjItsBGBnZzgQ+L3LM2cDbQLvi52vVqpWVxcyZZl4W1mz+/BK+8Omn0S9ceqnZb7+V6fek8pg+fXqiQ7AmTZrY2rVrN+2PGTPGHnvssU37CxYssGbNmll+fv4Wx7766qvWoUMH27hx46a2vffe28zMJk6caAcffLCtXr1602dff/21/bYD/30nw5+TpCZgipWQR+LZgzoTKFyIZnpkfyKwV+SFmeWGEJoHH57UFO/RbXvxmh30+ef+3q/fVla5KFwD55574N574xGCSIkmTpzIsmXLuPfee6lTpw5z587lyCOPZM6cOaxbt46MjAwKCgr4/fff6dWrF/feey+77LLLpuOvuuoq8vPzufHGG2nVqhUbNmzggshIoNatW3PffffRuXNnsrKyqF+/Pq1ataJGjRqJulyRmMVtuY0QwovA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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#输入SSDsim的输出文件 trace out\n",
    "#输出trace名字和相应的read latency\n",
    "import numpy as np\n",
    "import seaborn as sns\n",
    "import sys\n",
    "from openpyxl import Workbook\n",
    "from openpyxl.utils import get_column_letter\n",
    "import pandas as pd\n",
    "import scipy\n",
    "import os\n",
    "import sys\n",
    "import matplotlib.pyplot as plt\n",
    "from pylab import * \n",
    "import math\n",
    "import matplotlib \n",
    "from numpy import cumsum\n",
    "\n",
    "\n",
    "#数据输入\n",
    "def get_trace_reference(filename):\n",
    "    \n",
    "    file_base = open(filename)\n",
    "    \n",
    "    flag=0\n",
    "    \n",
    "    base_list=[]\n",
    "    \n",
    "    while 1:\n",
    "        \n",
    "        base_lines = file_base.readlines(100000)\n",
    "             \n",
    "        if (not base_lines):\n",
    "            \n",
    "            break \n",
    "            \n",
    "        for base_line in base_lines:\n",
    "\n",
    "            if str(base_line).startswith(\"      arrive\"):\n",
    "\n",
    "                flag=1\n",
    "                \n",
    "                continue\n",
    "\n",
    "            if str(base_line).startswith(\"the 0 channel,\"):\n",
    "\n",
    "                flag=0\n",
    "                \n",
    "            if(flag==1):\n",
    "                \n",
    "                if(len(base_line.split())!=7):\n",
    "                    \n",
    "                    print(\"error\\n\")\n",
    "                    \n",
    "                    print(base_line.split(),len(base_line.split()))\n",
    "                    \n",
    "                if(int(base_line.split()[3])==0):\n",
    "                    \n",
    "                    base_list.append( int(base_line.split()[6]))\n",
    "                 \n",
    "\n",
    "    file_base.close()\n",
    "    \n",
    "    return base_list\n",
    "\n",
    "def get_hist(latencys):\n",
    "    \n",
    "    #分割为1000份\n",
    "    max_latency=max(latencys)\n",
    "    \n",
    "    min_latency=min(latencys)\n",
    "    \n",
    "    granularity=1000000\n",
    "    \n",
    "    bins= math.ceil( (max_latency-min_latency)/granularity)  #ceil() 函数返回数字的上入整数。\n",
    "    \n",
    "    print(\"间隔 \",bins)\n",
    "    counters=[0 for i in range(granularity)]\n",
    "    \n",
    "    \n",
    "    for item in latencys:\n",
    "        \n",
    "        i= math.ceil( (item-min_latency)/bins)\n",
    "        \n",
    "        if(i<0 or i>(granularity-1)):\n",
    "            \n",
    "            print(\"overflow:\",i)\n",
    "        \n",
    "        if(i==granularity):\n",
    "            \n",
    "            i=i-1\n",
    "            \n",
    "        if(i==granularity+1):\n",
    "            \n",
    "            i=i-2\n",
    "            \n",
    "            \n",
    "        counters[i] = counters[i]+1\n",
    "    \n",
    "    sums=sum(counters)\n",
    "    \n",
    "    probability_counters= list(map(lambda x: x*1.0/sums, counters))\n",
    "    \n",
    "    #print(probability_counters,sum(probability_counters))\n",
    "    \n",
    "    probability_counters=cumsum(probability_counters)\n",
    "    \n",
    "    return probability_counters,[ (min_latency+i*bins)/1e6 for i in range(granularity)]\n",
    "\n",
    "base = get_trace_reference(\"result/base/1/DPROJ_4_out\")\n",
    "gc = get_trace_reference(\"result/Copy/1/DPROJ_4_out\")\n",
    "y,x=get_hist(base)\n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.5)<0.01 or  j>0.5):\n",
    "        \n",
    "        print(\"50% x轴坐标:\",i)\n",
    "        \n",
    "        label=i\n",
    "        \n",
    "        break\n",
    "\n",
    "\n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.9)<0.01 or  j>0.9):\n",
    "        \n",
    "        print(\"90% x轴坐标:\",i)    \n",
    "        break\n",
    "\n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.95)<0.01 or  j>0.95):\n",
    "        \n",
    "        print(\"95% x轴坐标:\",i)\n",
    "        \n",
    "        val_x=i\n",
    "        \n",
    "        break        \n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.99)<0.01 or  j>0.99):\n",
    "        \n",
    "        print(\"99% x轴坐标:\",i)        \n",
    "        \n",
    "        break  \n",
    "index = x.index(val_x)\n",
    "x1 = x[index:]\n",
    "y1 = y[index:]\n",
    "\n",
    "y,x=get_hist(gc)\n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.5)<0.01 or  j>0.5):\n",
    "        \n",
    "        print(\"50% x轴坐标:\",i)\n",
    "        \n",
    "        break\n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.9)<0.01 or  j>0.9):\n",
    "        \n",
    "        print(\"90% x轴坐标:\",i)\n",
    "        \n",
    "        break    \n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.95)<0.01 or  j>0.95):\n",
    "        \n",
    "        print(\"95% x轴坐标:\",i)\n",
    "        \n",
    "        val_x=i\n",
    "        \n",
    "        break        \n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.99)<0.01 or  j>0.99):\n",
    "        \n",
    "        print(\"99% x轴坐标:\",i)\n",
    "        \n",
    "        break         \n",
    "\n",
    "index = x.index(val_x)\n",
    "x2 = x[index:]\n",
    "y2 = y[index:]    \n",
    "\n",
    "\n",
    "plt.rcParams['xtick.direction'] = 'in'\n",
    "plt.rcParams['ytick.direction'] = 'in'\n",
    "tick_params(direction='in')\n",
    "ax = plt.gca()\n",
    "#ax.spines['right'].set_color('none') \n",
    "#ax.spines['top'].set_color('none')    \n",
    "ax.spines['top'].set_visible(True)\n",
    "ax.spines['right'].set_visible(True)\n",
    "plt.ylabel(\"CDF\")\n",
    "plt.xlabel(u\"写请求延迟(单位：毫秒)\") \n",
    "plt.plot(x1,y1,'b',label=\"BaseLine\")\n",
    "plt.legend(loc='lower center') \n",
    "\n",
    "\n",
    "plt.plot(x2,y2,'r',label=\"LA-GC\")\n",
    "plt.legend(loc = 'lower center') \n",
    "\n",
    "\n",
    "plt.tight_layout()\n",
    "\n",
    "plt.savefig(\"write.pdf\", bbox_inches = 'tight')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "50d3bec0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2539338\n",
      "1000\n",
      "间隔  3\n",
      "50% x轴坐标: 0.52069\n",
      "90% x轴坐标: 1.581664\n",
      "95% x轴坐标: 1.754593\n",
      "99% x轴坐标: 1.994407\n",
      "2002258\n",
      "1000\n",
      "间隔  3\n",
      "50% x轴坐标: 0.314401\n",
      "90% x轴坐标: 1.011073\n",
      "95% x轴坐标: 1.173583\n",
      "99% x轴坐标: 1.414936\n",
      "80% x轴坐标: 0.803176\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:213: UserWarning: Glyph 35835 (\\N{CJK UNIFIED IDEOGRAPH-8BFB}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:213: UserWarning: Glyph 35831 (\\N{CJK UNIFIED IDEOGRAPH-8BF7}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:213: UserWarning: Glyph 27714 (\\N{CJK UNIFIED IDEOGRAPH-6C42}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:213: UserWarning: Glyph 24310 (\\N{CJK UNIFIED IDEOGRAPH-5EF6}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:213: UserWarning: Glyph 36831 (\\N{CJK UNIFIED IDEOGRAPH-8FDF}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:213: UserWarning: Glyph 21333 (\\N{CJK UNIFIED IDEOGRAPH-5355}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:213: UserWarning: Glyph 20301 (\\N{CJK UNIFIED IDEOGRAPH-4F4D}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:213: UserWarning: Glyph 65306 (\\N{FULLWIDTH COLON}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:213: UserWarning: Glyph 27627 (\\N{CJK UNIFIED IDEOGRAPH-6BEB}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:213: UserWarning: Glyph 31186 (\\N{CJK UNIFIED IDEOGRAPH-79D2}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:215: UserWarning: Glyph 35835 (\\N{CJK UNIFIED IDEOGRAPH-8BFB}) missing from current font.\n",
      "  plt.savefig(\"read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:215: UserWarning: Glyph 35831 (\\N{CJK UNIFIED IDEOGRAPH-8BF7}) missing from current font.\n",
      "  plt.savefig(\"read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:215: UserWarning: Glyph 27714 (\\N{CJK UNIFIED IDEOGRAPH-6C42}) missing from current font.\n",
      "  plt.savefig(\"read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:215: UserWarning: Glyph 24310 (\\N{CJK UNIFIED IDEOGRAPH-5EF6}) missing from current font.\n",
      "  plt.savefig(\"read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:215: UserWarning: Glyph 36831 (\\N{CJK UNIFIED IDEOGRAPH-8FDF}) missing from current font.\n",
      "  plt.savefig(\"read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:215: UserWarning: Glyph 21333 (\\N{CJK UNIFIED IDEOGRAPH-5355}) missing from current font.\n",
      "  plt.savefig(\"read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:215: UserWarning: Glyph 20301 (\\N{CJK UNIFIED IDEOGRAPH-4F4D}) missing from current font.\n",
      "  plt.savefig(\"read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:215: UserWarning: Glyph 65306 (\\N{FULLWIDTH COLON}) missing from current font.\n",
      "  plt.savefig(\"read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:215: UserWarning: Glyph 27627 (\\N{CJK UNIFIED IDEOGRAPH-6BEB}) missing from current font.\n",
      "  plt.savefig(\"read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:215: UserWarning: Glyph 31186 (\\N{CJK UNIFIED IDEOGRAPH-79D2}) missing from current font.\n",
      "  plt.savefig(\"read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:215: UserWarning: Glyph 35835 (\\N{CJK UNIFIED IDEOGRAPH-8BFB}) missing from current font.\n",
      "  plt.savefig(\"read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:215: UserWarning: Glyph 35831 (\\N{CJK UNIFIED IDEOGRAPH-8BF7}) missing from current font.\n",
      "  plt.savefig(\"read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:215: UserWarning: Glyph 27714 (\\N{CJK UNIFIED IDEOGRAPH-6C42}) missing from current font.\n",
      "  plt.savefig(\"read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:215: UserWarning: Glyph 24310 (\\N{CJK UNIFIED IDEOGRAPH-5EF6}) missing from current font.\n",
      "  plt.savefig(\"read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:215: UserWarning: Glyph 36831 (\\N{CJK UNIFIED IDEOGRAPH-8FDF}) missing from current font.\n",
      "  plt.savefig(\"read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:215: UserWarning: Glyph 21333 (\\N{CJK UNIFIED IDEOGRAPH-5355}) missing from current font.\n",
      "  plt.savefig(\"read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:215: UserWarning: Glyph 20301 (\\N{CJK UNIFIED IDEOGRAPH-4F4D}) missing from current font.\n",
      "  plt.savefig(\"read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:215: UserWarning: Glyph 65306 (\\N{FULLWIDTH COLON}) missing from current font.\n",
      "  plt.savefig(\"read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:215: UserWarning: Glyph 27627 (\\N{CJK UNIFIED IDEOGRAPH-6BEB}) missing from current font.\n",
      "  plt.savefig(\"read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\3505907223.py:215: UserWarning: Glyph 31186 (\\N{CJK UNIFIED IDEOGRAPH-79D2}) missing from current font.\n",
      "  plt.savefig(\"read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 35835 (\\N{CJK UNIFIED IDEOGRAPH-8BFB}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 35831 (\\N{CJK UNIFIED IDEOGRAPH-8BF7}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 27714 (\\N{CJK UNIFIED IDEOGRAPH-6C42}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 24310 (\\N{CJK UNIFIED IDEOGRAPH-5EF6}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 36831 (\\N{CJK UNIFIED IDEOGRAPH-8FDF}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 21333 (\\N{CJK UNIFIED IDEOGRAPH-5355}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 20301 (\\N{CJK UNIFIED IDEOGRAPH-4F4D}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 65306 (\\N{FULLWIDTH COLON}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 27627 (\\N{CJK UNIFIED IDEOGRAPH-6BEB}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 31186 (\\N{CJK UNIFIED IDEOGRAPH-79D2}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "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1q1bx9SpU1m6dCkXXHABHTt25Omnn2bz5s289957jBw5stz327JlC3369KF3796sXbuWF198kTZt2jBp0iQmTpxIs2bNGD16NAUFBbz66qs8+eST1KpVKyl/u8i+yOyfVe+/7687dQqbQwQYOXIk/fv3Z+jQofTs2ZOioiL69OlDVlYWS5YsYd68eWzdupUhQ4bQokULRo4cSXFxMUcddRQ1a9Zk/fr15b5v3bp1ad26Nc452rVrx7Zt2/jf//1funTpwqxZs5g0aRKrVq2iZcuWtGrVio8//riK/3KR8mV2C2rxYmjcGA4+OHQSiYm9aekk21VXXUVWVhadOnWiS5cujB8/nuHDhwNQXFzML37xC3r16sUpp5zCuHHjWLp0KZdddhnt27enW7du7NixY5fvvd9+/n/16tWrU79+fQDq1KlDYWEhS5cupWXLlnTr1m2P7yNSlTK3BbVjB8ybBz/+cegkIt/Trl07Nm/eTI8ePejTpw/Z2dk45/jggw94+umnue6663jwwQdp27YtgwYNori4mFmzZrFly5YfvNf69etZtmzZbj+vbdu2PPzww3z77bd88MEHakFJbGRuC+qzz2D5cujZM3QSyXBvvfUWubm5DB48mAYNGjB9+nQeeeQRnnnmGS6//HLq1avHxIkTadGiBWPHjqVJkyZ0796dE044gWnTptG2bVsGDhzIMcccw9y5c1m0aBENGzakoKCAGTNmMHHiRN5//332339/1qxZw8qVK/n888/54IMP2LhxI4MGDeKFF17g8MMP5+qrr2bAgAGhd4kIAOacC52hQnJyctzChQuT94ajRsGVV8KCBZCTk7z3lZSzbNkyjjrqqNAxYk/7SaJiZouccz/4Is7cLr6nn4bmzXX+k4hITEXaxWdmNwPrgHrOuYdKbb8IyE7c3eacG2tmBwPXAWuAxc65uZEFy8vz6z/dfDNojjERkViKrAVlZmcA2c65MUADMyu9lvofnXMjnXMjgZKDQPcCTzrnhgG3WpSzU/7rX/7617+O7CNERGTfRNnFdy5QMnxoaeJ+iUVmdreZ5QDDEtu6AqXnZ2lV+s1yc3PJycnZeRkxYkTlk82e7ac30rEnEZHYirKLryGwMXE7H2hc6rGBwGPA34HuiW013HcjNkqe/0nJCxo1akRSBkk4B3PmwDnn7Pt7iYhIZKJsQeUCdRK3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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#输入SSDsim的输出文件 trace out\n",
    "#输出trace名字和相应的read latency\n",
    "import numpy as np\n",
    "import seaborn as sns\n",
    "import sys\n",
    "from openpyxl import Workbook\n",
    "from openpyxl.utils import get_column_letter\n",
    "import pandas as pd\n",
    "import scipy\n",
    "import os\n",
    "import sys\n",
    "import matplotlib.pyplot as plt\n",
    "from pylab import * \n",
    "import math\n",
    "import matplotlib \n",
    "from numpy import cumsum\n",
    "\n",
    "\n",
    "#数据输入\n",
    "def get_trace_reference(filename):\n",
    "    \n",
    "    file_base = open(filename)\n",
    "    \n",
    "    flag=0\n",
    "    \n",
    "    base_list=[]\n",
    "    \n",
    "    while 1:\n",
    "        \n",
    "        base_lines = file_base.readlines(100000)\n",
    "             \n",
    "        if (not base_lines):\n",
    "            \n",
    "            break \n",
    "            \n",
    "        for base_line in base_lines:\n",
    "\n",
    "            if str(base_line).startswith(\"      arrive\"):\n",
    "\n",
    "                flag=1\n",
    "                \n",
    "                continue\n",
    "\n",
    "            if str(base_line).startswith(\"the 0 channel,\"):\n",
    "\n",
    "                flag=0\n",
    "                \n",
    "            if(flag==1):\n",
    "                \n",
    "                if(len(base_line.split())!=7):\n",
    "                    \n",
    "                    print(\"error\\n\")\n",
    "                    \n",
    "                    print(base_line.split(),len(base_line.split()))\n",
    "                    \n",
    "                if(int(base_line.split()[3])==1):\n",
    "                    \n",
    "                    base_list.append( int(base_line.split()[6]))\n",
    "                 \n",
    "\n",
    "    file_base.close()\n",
    "    \n",
    "    return base_list[10000:20000]\n",
    "\n",
    "def get_hist(latencys):\n",
    "    \n",
    "    #分割为1000份\n",
    "    max_latency=max(latencys)\n",
    "    \n",
    "    min_latency=min(latencys)\n",
    "    print(max_latency)\n",
    "    print(min_latency)\n",
    "    granularity=1000000\n",
    "    \n",
    "    bins= math.ceil( (max_latency-min_latency)/granularity)  #ceil() 函数返回数字的上入整数。\n",
    "    \n",
    "    print(\"间隔 \",bins)\n",
    "    counters=[0 for i in range(granularity)]\n",
    "    \n",
    "    \n",
    "    for item in latencys:\n",
    "        \n",
    "        i= math.ceil( (item-min_latency)/bins)\n",
    "        \n",
    "        if(i<0 or i>(granularity-1)):\n",
    "            \n",
    "            print(\"overflow:\",i)\n",
    "        \n",
    "        if(i==granularity):\n",
    "            \n",
    "            i=i-1\n",
    "            \n",
    "        if(i==granularity+1):\n",
    "            \n",
    "            i=i-2\n",
    "            \n",
    "            \n",
    "        counters[i] = counters[i]+1\n",
    "    \n",
    "    sums=sum(counters)\n",
    "    \n",
    "    probability_counters= list(map(lambda x: x*1.0/sums, counters))\n",
    "    \n",
    "    #print(probability_counters,sum(probability_counters))\n",
    "    \n",
    "    probability_counters=cumsum(probability_counters)\n",
    "    \n",
    "    return probability_counters,[ (min_latency+i*bins)/1e6 for i in range(granularity)]\n",
    "\n",
    "base = get_trace_reference(\"result/base/1/DPROJ_3_out\")\n",
    "gc = get_trace_reference(\"result/Copy/1/DPROJ_3_out\")\n",
    "y,x=get_hist(base)\n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.5)<0.01 or  j>0.5):\n",
    "        \n",
    "        print(\"50% x轴坐标:\",i)\n",
    "        \n",
    "        label=i\n",
    "        \n",
    "        break\n",
    "\n",
    "\n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.9)<0.01 or  j>0.9):\n",
    "        \n",
    "        print(\"90% x轴坐标:\",i)    \n",
    "        break\n",
    "\n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.95)<0.01 or  j>0.95):\n",
    "        \n",
    "        print(\"95% x轴坐标:\",i)\n",
    "        \n",
    "        val_x=i\n",
    "        \n",
    "        break        \n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.99)<0.01 or  j>0.99):\n",
    "        \n",
    "        print(\"99% x轴坐标:\",i)        \n",
    "        \n",
    "        break  \n",
    "index = x.index(val_x)\n",
    "x1 = x[index:]\n",
    "y1 = y[index:]\n",
    "\n",
    "y,x=get_hist(gc)\n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.5)<0.01 or  j>0.5):\n",
    "        \n",
    "        print(\"50% x轴坐标:\",i)\n",
    "        \n",
    "        break\n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.9)<0.01 or  j>0.9):\n",
    "        \n",
    "        print(\"90% x轴坐标:\",i)\n",
    "        \n",
    "        break    \n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.95)<0.01 or  j>0.95):\n",
    "        \n",
    "        print(\"95% x轴坐标:\",i)\n",
    "        \n",
    "        \n",
    "        break        \n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.99)<0.01 or  j>0.99):\n",
    "        \n",
    "        print(\"99% x轴坐标:\",i)\n",
    "        \n",
    "        break         \n",
    "for (i,j) in zip(x,y):\n",
    "    \n",
    "    if( abs(j-0.8)<0.01 or  j>0.8):\n",
    "        \n",
    "        print(\"80% x轴坐标:\",i)\n",
    "        \n",
    "        val_x=i\n",
    "        \n",
    "        break  \n",
    "index = x.index(val_x)\n",
    "x2 = x[index:]\n",
    "y2 = y[index:]    \n",
    "\n",
    "\n",
    "plt.rcParams['xtick.direction'] = 'in'\n",
    "plt.rcParams['ytick.direction'] = 'in'\n",
    "tick_params(direction='in')\n",
    "ax = plt.gca()\n",
    "#ax.spines['right'].set_color('none') \n",
    "#ax.spines['top'].set_color('none')    \n",
    "ax.spines['top'].set_visible(True)\n",
    "ax.spines['right'].set_visible(True)\n",
    "plt.ylabel(\"CDF\")\n",
    "plt.xlabel(u\"读请求延迟(单位：毫秒)\") \n",
    "plt.plot(x1,y1,'b',label=\"BaseLine\")\n",
    "plt.legend(loc='lower center') \n",
    "\n",
    "\n",
    "plt.plot(x2,y2,'r',label=\"LA-GC\")\n",
    "plt.legend(loc = 'lower center') \n",
    "\n",
    "\n",
    "plt.tight_layout()\n",
    "\n",
    "plt.savefig(\"read.pdf\", bbox_inches = 'tight')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "35ad6947",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:80: UserWarning: Glyph 26102 (\\N{CJK UNIFIED IDEOGRAPH-65F6}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:80: UserWarning: Glyph 38388 (\\N{CJK UNIFIED IDEOGRAPH-95F4}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:80: UserWarning: Glyph 65288 (\\N{FULLWIDTH LEFT PARENTHESIS}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:80: UserWarning: Glyph 21333 (\\N{CJK UNIFIED IDEOGRAPH-5355}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:80: UserWarning: Glyph 20301 (\\N{CJK UNIFIED IDEOGRAPH-4F4D}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:80: UserWarning: Glyph 65306 (\\N{FULLWIDTH COLON}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:80: UserWarning: Glyph 23567 (\\N{CJK UNIFIED IDEOGRAPH-5C0F}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:80: UserWarning: Glyph 65289 (\\N{FULLWIDTH RIGHT PARENTHESIS}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:80: UserWarning: Glyph 35835 (\\N{CJK UNIFIED IDEOGRAPH-8BFB}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:80: UserWarning: Glyph 35831 (\\N{CJK UNIFIED IDEOGRAPH-8BF7}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:80: UserWarning: Glyph 27714 (\\N{CJK UNIFIED IDEOGRAPH-6C42}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:80: UserWarning: Glyph 24310 (\\N{CJK UNIFIED IDEOGRAPH-5EF6}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:80: UserWarning: Glyph 36831 (\\N{CJK UNIFIED IDEOGRAPH-8FDF}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:80: UserWarning: Glyph 27627 (\\N{CJK UNIFIED IDEOGRAPH-6BEB}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:80: UserWarning: Glyph 31186 (\\N{CJK UNIFIED IDEOGRAPH-79D2}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 26102 (\\N{CJK UNIFIED IDEOGRAPH-65F6}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 38388 (\\N{CJK UNIFIED IDEOGRAPH-95F4}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 65288 (\\N{FULLWIDTH LEFT PARENTHESIS}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 21333 (\\N{CJK UNIFIED IDEOGRAPH-5355}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 20301 (\\N{CJK UNIFIED IDEOGRAPH-4F4D}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 65306 (\\N{FULLWIDTH COLON}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 23567 (\\N{CJK UNIFIED IDEOGRAPH-5C0F}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 65289 (\\N{FULLWIDTH RIGHT PARENTHESIS}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 35835 (\\N{CJK UNIFIED IDEOGRAPH-8BFB}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 35831 (\\N{CJK UNIFIED IDEOGRAPH-8BF7}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 27714 (\\N{CJK UNIFIED IDEOGRAPH-6C42}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 24310 (\\N{CJK UNIFIED IDEOGRAPH-5EF6}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 36831 (\\N{CJK UNIFIED IDEOGRAPH-8FDF}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 27627 (\\N{CJK UNIFIED IDEOGRAPH-6BEB}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 31186 (\\N{CJK UNIFIED IDEOGRAPH-79D2}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 26102 (\\N{CJK UNIFIED IDEOGRAPH-65F6}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 38388 (\\N{CJK UNIFIED IDEOGRAPH-95F4}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 65288 (\\N{FULLWIDTH LEFT PARENTHESIS}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 21333 (\\N{CJK UNIFIED IDEOGRAPH-5355}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 20301 (\\N{CJK UNIFIED IDEOGRAPH-4F4D}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 65306 (\\N{FULLWIDTH COLON}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 23567 (\\N{CJK UNIFIED IDEOGRAPH-5C0F}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 65289 (\\N{FULLWIDTH RIGHT PARENTHESIS}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 35835 (\\N{CJK UNIFIED IDEOGRAPH-8BFB}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 35831 (\\N{CJK UNIFIED IDEOGRAPH-8BF7}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 27714 (\\N{CJK UNIFIED IDEOGRAPH-6C42}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 24310 (\\N{CJK UNIFIED IDEOGRAPH-5EF6}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 36831 (\\N{CJK UNIFIED IDEOGRAPH-8FDF}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 27627 (\\N{CJK UNIFIED IDEOGRAPH-6BEB}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\1217086695.py:81: UserWarning: Glyph 31186 (\\N{CJK UNIFIED IDEOGRAPH-79D2}) missing from current font.\n",
      "  plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 26102 (\\N{CJK UNIFIED IDEOGRAPH-65F6}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 38388 (\\N{CJK UNIFIED IDEOGRAPH-95F4}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 65288 (\\N{FULLWIDTH LEFT PARENTHESIS}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 21333 (\\N{CJK UNIFIED IDEOGRAPH-5355}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 20301 (\\N{CJK UNIFIED IDEOGRAPH-4F4D}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 65306 (\\N{FULLWIDTH COLON}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 23567 (\\N{CJK UNIFIED IDEOGRAPH-5C0F}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 65289 (\\N{FULLWIDTH RIGHT PARENTHESIS}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 35835 (\\N{CJK UNIFIED IDEOGRAPH-8BFB}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 35831 (\\N{CJK UNIFIED IDEOGRAPH-8BF7}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 27714 (\\N{CJK UNIFIED IDEOGRAPH-6C42}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 24310 (\\N{CJK UNIFIED IDEOGRAPH-5EF6}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 36831 (\\N{CJK UNIFIED IDEOGRAPH-8FDF}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 27627 (\\N{CJK UNIFIED IDEOGRAPH-6BEB}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 31186 (\\N{CJK UNIFIED IDEOGRAPH-79D2}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#输入SSDsim的输出文件 trace out\n",
    "#输出trace名字和相应的read latency\n",
    "import numpy as np\n",
    "import seaborn as sns\n",
    "import sys\n",
    "from openpyxl import Workbook\n",
    "from openpyxl.utils import get_column_letter\n",
    "import pandas as pd\n",
    "import scipy\n",
    "import os\n",
    "import sys\n",
    "import matplotlib.pyplot as plt\n",
    "from pylab import * \n",
    "import math\n",
    "from numpy import cumsum\n",
    "\n",
    "%matplotlib inline\n",
    "\n",
    "#数据输入\n",
    "def get_trace_reference(filename):\n",
    "    \n",
    "    file_base = open(filename)\n",
    "    \n",
    "    flag=0\n",
    "    \n",
    "    x = []\n",
    "    y = []\n",
    "    \n",
    "    while 1:\n",
    "        \n",
    "        base_lines = file_base.readlines(100000)\n",
    "             \n",
    "        if (not base_lines):\n",
    "            \n",
    "            break \n",
    "            \n",
    "        for base_line in base_lines:\n",
    "\n",
    "            if str(base_line).startswith(\"      arrive\"):\n",
    "\n",
    "                flag=1\n",
    "                \n",
    "                continue\n",
    "\n",
    "            if str(base_line).startswith(\"the 0 channel,\"):\n",
    "\n",
    "                flag=0\n",
    "                \n",
    "            if(flag==1):\n",
    "                \n",
    "                if(len(base_line.split())!=7):\n",
    "                    \n",
    "                    print(\"error\\n\")\n",
    "                    \n",
    "                    print(base_line.split(),len(base_line.split()))\n",
    "                    \n",
    "                if(int(base_line.split()[3])==1):\n",
    "                    if(int(base_line.split()[6])!=1000):\n",
    "                        x.append(int(base_line.split()[4])/1e9/3600)\n",
    "                        y.append(int(base_line.split()[6])/1e6)\n",
    "    file_base.close()\n",
    "    \n",
    "    return x,y\n",
    "\n",
    "mpl.rcParams['axes.unicode_minus'] = False #解决保存图像是负号'-'显示为方块的问题\n",
    "plt.rcParams['xtick.direction'] = 'in'\n",
    "plt.rcParams['ytick.direction'] = 'in'\n",
    "tick_params(direction='in')\n",
    "ax = plt.gca()\n",
    "    \n",
    "\n",
    "x1,y1 = get_trace_reference(\"result/base/1/DPROJ_1_out\")\n",
    "x2,y2 = get_trace_reference(\"result/Copy/1/DPROJ_1_out\")\n",
    "plt.plot(x1,y1,'b--',label=\"BaseLine\")\n",
    "plt.plot(x2,y2,'r--',label=\"LA-GC\")\n",
    " \n",
    "plt.ylabel(\"读请求延迟（单位：毫秒）\")\n",
    "plt.xlabel(\"时间（单位：小时）\")\n",
    "plt.legend(loc = 'best') \n",
    "plt.tight_layout()\n",
    "plt.savefig(\"op_read.pdf\", bbox_inches = 'tight')\n",
    "plt.show() "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "922826bb",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:81: UserWarning: Glyph 26102 (\\N{CJK UNIFIED IDEOGRAPH-65F6}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:81: UserWarning: Glyph 38388 (\\N{CJK UNIFIED IDEOGRAPH-95F4}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:81: UserWarning: Glyph 65288 (\\N{FULLWIDTH LEFT PARENTHESIS}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:81: UserWarning: Glyph 21333 (\\N{CJK UNIFIED IDEOGRAPH-5355}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:81: UserWarning: Glyph 20301 (\\N{CJK UNIFIED IDEOGRAPH-4F4D}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:81: UserWarning: Glyph 65306 (\\N{FULLWIDTH COLON}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:81: UserWarning: Glyph 23567 (\\N{CJK UNIFIED IDEOGRAPH-5C0F}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:81: UserWarning: Glyph 65289 (\\N{FULLWIDTH RIGHT PARENTHESIS}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:81: UserWarning: Glyph 20889 (\\N{CJK UNIFIED IDEOGRAPH-5199}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:81: UserWarning: Glyph 35831 (\\N{CJK UNIFIED IDEOGRAPH-8BF7}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:81: UserWarning: Glyph 27714 (\\N{CJK UNIFIED IDEOGRAPH-6C42}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:81: UserWarning: Glyph 24310 (\\N{CJK UNIFIED IDEOGRAPH-5EF6}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:81: UserWarning: Glyph 36831 (\\N{CJK UNIFIED IDEOGRAPH-8FDF}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:81: UserWarning: Glyph 27627 (\\N{CJK UNIFIED IDEOGRAPH-6BEB}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:81: UserWarning: Glyph 31186 (\\N{CJK UNIFIED IDEOGRAPH-79D2}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 26102 (\\N{CJK UNIFIED IDEOGRAPH-65F6}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 38388 (\\N{CJK UNIFIED IDEOGRAPH-95F4}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 65288 (\\N{FULLWIDTH LEFT PARENTHESIS}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 21333 (\\N{CJK UNIFIED IDEOGRAPH-5355}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 20301 (\\N{CJK UNIFIED IDEOGRAPH-4F4D}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 65306 (\\N{FULLWIDTH COLON}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 23567 (\\N{CJK UNIFIED IDEOGRAPH-5C0F}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 65289 (\\N{FULLWIDTH RIGHT PARENTHESIS}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 20889 (\\N{CJK UNIFIED IDEOGRAPH-5199}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 35831 (\\N{CJK UNIFIED IDEOGRAPH-8BF7}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 27714 (\\N{CJK UNIFIED IDEOGRAPH-6C42}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 24310 (\\N{CJK UNIFIED IDEOGRAPH-5EF6}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 36831 (\\N{CJK UNIFIED IDEOGRAPH-8FDF}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 27627 (\\N{CJK UNIFIED IDEOGRAPH-6BEB}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 31186 (\\N{CJK UNIFIED IDEOGRAPH-79D2}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 26102 (\\N{CJK UNIFIED IDEOGRAPH-65F6}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 38388 (\\N{CJK UNIFIED IDEOGRAPH-95F4}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 65288 (\\N{FULLWIDTH LEFT PARENTHESIS}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 21333 (\\N{CJK UNIFIED IDEOGRAPH-5355}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 20301 (\\N{CJK UNIFIED IDEOGRAPH-4F4D}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 65306 (\\N{FULLWIDTH COLON}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 23567 (\\N{CJK UNIFIED IDEOGRAPH-5C0F}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 65289 (\\N{FULLWIDTH RIGHT PARENTHESIS}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 20889 (\\N{CJK UNIFIED IDEOGRAPH-5199}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 35831 (\\N{CJK UNIFIED IDEOGRAPH-8BF7}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 27714 (\\N{CJK UNIFIED IDEOGRAPH-6C42}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 24310 (\\N{CJK UNIFIED IDEOGRAPH-5EF6}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 36831 (\\N{CJK UNIFIED IDEOGRAPH-8FDF}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 27627 (\\N{CJK UNIFIED IDEOGRAPH-6BEB}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Temp\\ipykernel_20336\\280164728.py:82: UserWarning: Glyph 31186 (\\N{CJK UNIFIED IDEOGRAPH-79D2}) missing from current font.\n",
      "  plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 26102 (\\N{CJK UNIFIED IDEOGRAPH-65F6}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 38388 (\\N{CJK UNIFIED IDEOGRAPH-95F4}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 65288 (\\N{FULLWIDTH LEFT PARENTHESIS}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 21333 (\\N{CJK UNIFIED IDEOGRAPH-5355}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 20301 (\\N{CJK UNIFIED IDEOGRAPH-4F4D}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 65306 (\\N{FULLWIDTH COLON}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 23567 (\\N{CJK UNIFIED IDEOGRAPH-5C0F}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 65289 (\\N{FULLWIDTH RIGHT PARENTHESIS}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 20889 (\\N{CJK UNIFIED IDEOGRAPH-5199}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 35831 (\\N{CJK UNIFIED IDEOGRAPH-8BF7}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 27714 (\\N{CJK UNIFIED IDEOGRAPH-6C42}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 24310 (\\N{CJK UNIFIED IDEOGRAPH-5EF6}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 36831 (\\N{CJK UNIFIED IDEOGRAPH-8FDF}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 27627 (\\N{CJK UNIFIED IDEOGRAPH-6BEB}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\Users\\wyc\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\IPython\\core\\pylabtools.py:151: UserWarning: Glyph 31186 (\\N{CJK UNIFIED IDEOGRAPH-79D2}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#输入SSDsim的输出文件 trace out\n",
    "#输出trace名字和相应的read latency\n",
    "import numpy as np\n",
    "import seaborn as sns\n",
    "import sys\n",
    "from openpyxl import Workbook\n",
    "from openpyxl.utils import get_column_letter\n",
    "import pandas as pd\n",
    "import scipy\n",
    "import os\n",
    "import sys\n",
    "import matplotlib.pyplot as plt\n",
    "from pylab import * \n",
    "import math\n",
    "from numpy import cumsum\n",
    "\n",
    "%matplotlib inline\n",
    "\n",
    "#数据输入\n",
    "def get_trace_reference(filename):\n",
    "    \n",
    "    file_base = open(filename)\n",
    "    \n",
    "    flag=0\n",
    "    \n",
    "    x = []\n",
    "    y = []\n",
    "    \n",
    "    while 1:\n",
    "        \n",
    "        base_lines = file_base.readlines(100000)\n",
    "             \n",
    "        if (not base_lines):\n",
    "            \n",
    "            break \n",
    "            \n",
    "        for base_line in base_lines:\n",
    "\n",
    "            if str(base_line).startswith(\"      arrive\"):\n",
    "\n",
    "                flag=1\n",
    "                \n",
    "                continue\n",
    "\n",
    "            if str(base_line).startswith(\"the 0 channel,\"):\n",
    "\n",
    "                flag=0\n",
    "                \n",
    "            if(flag==1):\n",
    "                \n",
    "                if(len(base_line.split())!=7):\n",
    "                    \n",
    "                    print(\"error\\n\")\n",
    "                    \n",
    "                    print(base_line.split(),len(base_line.split()))\n",
    "                    \n",
    "                if(int(base_line.split()[3])==0):\n",
    "                    if(int(base_line.split()[6])!=1000):\n",
    "                        x.append(int(base_line.split()[4])/1e9/3600)\n",
    "                        y.append(int(base_line.split()[6])/1e6)\n",
    "    file_base.close()\n",
    "    \n",
    "    return x,y\n",
    "\n",
    "mpl.rcParams['axes.unicode_minus'] = False #解决保存图像是负号'-'显示为方块的问题\n",
    "plt.rcParams['xtick.direction'] = 'in'\n",
    "plt.rcParams['ytick.direction'] = 'in'\n",
    "tick_params(direction='in')\n",
    "ax = plt.gca()\n",
    "    \n",
    "\n",
    "x1,y1 = get_trace_reference(\"result/base/1/DPROJ_1_out\")\n",
    "x2,y2 = get_trace_reference(\"result/Copy/1/DPROJ_1_out\")\n",
    "\n",
    "plt.plot(x1,y1,'b--',label=\"BaseLine\")\n",
    "plt.plot(x2,y2,'r--',label=\"LA-GC\")\n",
    " \n",
    "plt.ylabel(\"写请求延迟（单位：毫秒）\")\n",
    "plt.xlabel(\"时间（单位：小时）\")\n",
    "plt.legend(loc = 'best') \n",
    "plt.tight_layout()\n",
    "plt.savefig(\"op_write.pdf\", bbox_inches = 'tight')\n",
    "plt.show() "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "8e87930e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "plt.rcParams['font.sans-serif']='SimHei' #用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号\n",
    "\n",
    "x = np.linspace(0.05,10,1000)\n",
    "y = np.random.randn(1000)\n",
    "\n",
    "plt.plot(x,y,label=\"scatter figure\")\n",
    "plt.legend()\n",
    "\n",
    "plt.xlabel(u\"这是x轴\")\n",
    "plt.ylabel(u\"这是y轴\")\n",
    "\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "5e0d0ee7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "d:\\python\\lib\\site-packages\\matplotlib\\mpl-data\\matplotlibrc\n"
     ]
    }
   ],
   "source": [
    "import matplotlib\n",
    "print(matplotlib.matplotlib_fname()) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "8c0f90ca",
   "metadata": {},
   "outputs": [
    {
     "ename": "ImportError",
     "evalue": "cannot import name '_rebuild' from 'matplotlib.font_manager' (d:\\python\\lib\\site-packages\\matplotlib\\font_manager.py)",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mImportError\u001b[0m                               Traceback (most recent call last)",
      "\u001b[1;32m~\\AppData\\Local\\Temp/ipykernel_51836/2123356069.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0mmatplotlib\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfont_manager\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0m_rebuild\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mImportError\u001b[0m: cannot import name '_rebuild' from 'matplotlib.font_manager' (d:\\python\\lib\\site-packages\\matplotlib\\font_manager.py)"
     ]
    }
   ],
   "source": [
    "from matplotlib.font_manager import _rebuild"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "cbe1718a",
   "metadata": {},
   "outputs": [],
   "source": [
    "import shutil\n",
    "import matplotlib\n",
    "\n",
    "shutil.rmtree(matplotlib.get_cachedir())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "e4a52107",
   "metadata": {},
   "outputs": [
    {
     "ename": "ImportError",
     "evalue": "cannot import name '_rebuild' from 'matplotlib.font_manager' (d:\\python\\lib\\site-packages\\matplotlib\\font_manager.py)",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mImportError\u001b[0m                               Traceback (most recent call last)",
      "\u001b[1;32m~\\AppData\\Local\\Temp/ipykernel_51836/2123356069.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0mmatplotlib\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfont_manager\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0m_rebuild\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mImportError\u001b[0m: cannot import name '_rebuild' from 'matplotlib.font_manager' (d:\\python\\lib\\site-packages\\matplotlib\\font_manager.py)"
     ]
    }
   ],
   "source": [
    "from matplotlib.font_manager import _rebuild"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "7aa675f3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x21230191438>"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAD0CAYAAACW9iHhAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAd6klEQVR4nO3df5hVZb338fdHxQAVVByUwgLiyDFN7WokFY4g/jiooRbWKZvjjyROT/429egxijJLPT6V+euJq055yLBL0R5RD6T8MJEUQZMnLUSTchRsQEEUENDv88dag7tp9qy9h7327GF/Xte1r732Wvda68vWme/c973u+1ZEYGZm9WuHrg7AzMy6lhOBmVmdcyIwM6tzTgRmZnXOicDMrM45EZiZ1bmdujqAcu21114xaNCgrg7DzKxbWbx48aqIaGjvWLdLBIMGDWLRokVdHYaZWbci6c/FjrlpyMyszjkRmJnVOScCM7M61+36CMys/mzevJnm5mY2btzY1aHUvJ49ezJw4EB69OhR8jlOBGZW85qbm9ltt90YNGgQkro6nJoVEaxevZrm5mYGDx5c8nluGjKzmrdx40b69evnJJBBEv369Su75uREYGbdgpNAaTrzPblpyMy6nUGX31/R6y2/5sTMMpMnT2batGn079+f3r17c+edd9KnT59O3e/MM89kwoQJjBw58u+OnXfeedx4442dum5nORFYSTr7g1fKD5hZdzFp0iSampr47ne/yy9+8Qu+/OUvV/we1U4C4KYhM7OytbS00KtXL5qamhg5ciQnnXQSmzdvZuPGjYwbN44jjjiCU089lS1btrB+/XpOPfVURowYwTnnnJN57dGjR2/dnjx5Ml/72tcYMWIEBx98MCtXriz7eqVwIjAzK9HVV1/NoYceyowZMzj++OM57rjjmDt3Ln369OHJJ5/kmWeeQRILFixgwoQJvPnmm0yZMoUDDzyQRx99lBUrVrBkyZKy7rl06VLmz5/Paaedxpw5c7b5eu1x05CZWYmuvPJKmpqa+MEPfsAVV1zB22+/za9+9StaWlrYsGEDo0aN4qMf/Sjjxo1jyJAhHH300SxdupQFCxYwb9481qxZw8svv1zWPc844wwksffee7Np06Z2r3fQQQdt078r1xqBpB6SZqTboyXNT18vSTqjyDljJTUXlB2WZ4xmZuXq27cv9957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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "1adf0d09",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[6843547, 1451016, 18143322, 11690064, 3864415, 866921, 754371, 1040867]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "base\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "8a724e21",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[5160445, 1305759, 14762695, 7100441, 3042936, 747585, 646754, 670186]"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "4afbd22a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x2123079c390>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "\n",
    "labels = ['G1', 'G2', 'G3', 'G4', 'G5']\n",
    "men_means = [20, 34, 30, 35, 27]\n",
    "women_means = [25, 32, 34, 20, 25]\n",
    "\n",
    "x = np.arange(len(labels))  # the label locations\n",
    "width = 0.35  # the width of the bars\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "rects1 = ax.bar(x - width/2, men_means, width, label='Men')\n",
    "rects2 = ax.bar(x + width/2, women_means, width, label='Women')\n",
    "\n",
    "# Add some text for labels, title and custom x-axis tick labels, etc.\n",
    "ax.set_ylabel('Scores')\n",
    "ax.set_title('Scores by group and gender')\n",
    "ax.set_xticks(x)\n",
    "ax.set_xticklabels(labels)\n",
    "ax.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "51908195",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAD0CAYAAACW9iHhAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAd6klEQVR4nO3df5hVZb338fdHxQAVVByUwgLiyDFN7WokFY4g/jiooRbWKZvjjyROT/429egxijJLPT6V+euJq055yLBL0R5RD6T8MJEUQZMnLUSTchRsQEEUENDv88dag7tp9qy9h7327GF/Xte1r732Wvda68vWme/c973u+1ZEYGZm9WuHrg7AzMy6lhOBmVmdcyIwM6tzTgRmZnXOicDMrM45EZiZ1bmdujqAcu21114xaNCgrg7DzKxbWbx48aqIaGjvWLdLBIMGDWLRokVdHYaZWbci6c/FjrlpyMyszjkRmJnVOScCM7M61+36CMys/mzevJnm5mY2btzY1aHUvJ49ezJw4EB69OhR8jlOBGZW85qbm9ltt90YNGgQkro6nJoVEaxevZrm5mYGDx5c8nluGjKzmrdx40b69evnJJBBEv369Su75uREYGbdgpNAaTrzPblpyMy6nUGX31/R6y2/5sTMMpMnT2batGn079+f3r17c+edd9KnT59O3e/MM89kwoQJjBw58u+OnXfeedx4442dum5nORFYSTr7g1fKD5hZdzFp0iSampr47ne/yy9+8Qu+/OUvV/we1U4C4KYhM7OytbS00KtXL5qamhg5ciQnnXQSmzdvZuPGjYwbN44jjjiCU089lS1btrB+/XpOPfVURowYwTnnnJN57dGjR2/dnjx5Ml/72tcYMWIEBx98MCtXriz7eqVwIjAzK9HVV1/NoYceyowZMzj++OM57rjjmDt3Ln369OHJJ5/kmWeeQRILFixgwoQJvPnmm0yZMoUDDzyQRx99lBUrVrBkyZKy7rl06VLmz5/Paaedxpw5c7b5eu1x05CZWYmuvPJKmpqa+MEPfsAVV1zB22+/za9+9StaWlrYsGEDo0aN4qMf/Sjjxo1jyJAhHH300SxdupQFCxYwb9481qxZw8svv1zWPc844wwksffee7Np06Z2r3fQQQdt078r1xqBpB6SZqTboyXNT18vSTqjyDljJTUXlB2WZ4xmZuXq27cv9957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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#输入SSDsim的输出文件 trace out\n",
    "#输出trace名字和相应的read latency\n",
    "import numpy as np\n",
    "import seaborn as sns\n",
    "import sys\n",
    "from openpyxl import Workbook\n",
    "from openpyxl.utils import get_column_letter\n",
    "import pandas as pd\n",
    "import scipy\n",
    "import os\n",
    "import sys\n",
    "import matplotlib.pyplot as plt\n",
    "from pylab import * \n",
    "import math\n",
    "from numpy import cumsum\n",
    "\n",
    "%matplotlib inline\n",
    "\n",
    "#数据输入\n",
    "def get_trace_reference(filename):\n",
    "    \n",
    "    file_base = open(filename)\n",
    "    \n",
    "    flag=0\n",
    "    \n",
    "    x = []\n",
    "    \n",
    "    while 1:\n",
    "        \n",
    "        base_lines = file_base.readlines(100000)\n",
    "             \n",
    "        if (not base_lines):\n",
    "            \n",
    "            break \n",
    "            \n",
    "        for base_line in base_lines:\n",
    "\n",
    "            if str(base_line).startswith(\"read request average response time:\"):\n",
    "                number = int(base_line.split()[5]) / 1e6\n",
    "                x.append(number)\n",
    "\n",
    "    file_base.close()\n",
    "    \n",
    "    return x\n",
    "\n",
    "\n",
    "base = get_trace_reference(\"base_stat.txt\")\n",
    "gc = get_trace_reference(\"gc_stat.txt\")\n",
    "labels = [\"HM_0\",\"HM_1\",\"PRN_0\",\"PRN_1\",\"PROJ_1\",\"PROJ_3\",\"PROJ_4\",\"PRXY_0\"]\n",
    "x = np.arange(len(labels))  # the label locations\n",
    "width = 0.35  # the width of the bars\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "rects1 = ax.bar(x - width/2, base, width, label='BaseLine')\n",
    "rects2 = ax.bar(x + width/2, gc, width, label='LA-GC')\n",
    "\n",
    "# Add some text for labels, title and custom x-axis tick labels, etc.\n",
    "ax.set_ylabel('读请求平均延迟（单位：毫秒）')\n",
    "ax.set_xticks(x)\n",
    "ax.set_xticklabels(labels)\n",
    "ax.legend()\n",
    "plt.savefig(\"read_avg.png\", bbox_inches = 'tight')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "db02857c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#输入SSDsim的输出文件 trace out\n",
    "#输出trace名字和相应的read latency\n",
    "import numpy as np\n",
    "import seaborn as sns\n",
    "import sys\n",
    "from openpyxl import Workbook\n",
    "from openpyxl.utils import get_column_letter\n",
    "import pandas as pd\n",
    "import scipy\n",
    "import os\n",
    "import sys\n",
    "import matplotlib.pyplot as plt\n",
    "from pylab import * \n",
    "import math\n",
    "from numpy import cumsum\n",
    "\n",
    "%matplotlib inline\n",
    "\n",
    "#数据输入\n",
    "def get_trace_reference(filename):\n",
    "    \n",
    "    file_base = open(filename)\n",
    "    \n",
    "    flag=0\n",
    "    \n",
    "    x = []\n",
    "    \n",
    "    while 1:\n",
    "        \n",
    "        base_lines = file_base.readlines(100000)\n",
    "             \n",
    "        if (not base_lines):\n",
    "            \n",
    "            break \n",
    "            \n",
    "        for base_line in base_lines:\n",
    "\n",
    "            if str(base_line).startswith(\"write request average response time:\"):\n",
    "                number = int(base_line.split()[5]) / 1e6\n",
    "                x.append(number)\n",
    "\n",
    "    file_base.close()\n",
    "    \n",
    "    return x\n",
    "\n",
    "\n",
    "base = get_trace_reference(\"base_stat.txt\")\n",
    "gc = get_trace_reference(\"gc_stat.txt\")\n",
    "labels = [\"HM_0\",\"HM_1\",\"PRN_0\",\"PRN_1\",\"PROJ_1\",\"PROJ_3\",\"PROJ_4\",\"PRXY_0\"]\n",
    "x = np.arange(len(labels))  # the label locations\n",
    "width = 0.35  # the width of the bars\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "rects1 = ax.bar(x - width/2, base, width, label='BaseLine')\n",
    "rects2 = ax.bar(x + width/2, gc, width, label='LA-GC')\n",
    "\n",
    "# Add some text for labels, title and custom x-axis tick labels, etc.\n",
    "ax.set_ylabel('写请求平均延迟（单位：毫秒）')\n",
    "ax.set_xticks(x)\n",
    "ax.set_xticklabels(labels)\n",
    "ax.legend()\n",
    "plt.savefig(\"write_avg.png\", bbox_inches = 'tight')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "ee0d860b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#输入SSDsim的输出文件 trace out\n",
    "#输出trace名字和相应的read latency\n",
    "import numpy as np\n",
    "import seaborn as sns\n",
    "import sys\n",
    "from openpyxl import Workbook\n",
    "from openpyxl.utils import get_column_letter\n",
    "import pandas as pd\n",
    "import scipy\n",
    "import os\n",
    "import sys\n",
    "import matplotlib.pyplot as plt\n",
    "from pylab import * \n",
    "import math\n",
    "from numpy import cumsum\n",
    "\n",
    "%matplotlib inline\n",
    "\n",
    "#数据输入\n",
    "def get_trace_reference(filename):\n",
    "    \n",
    "    file_base = open(filename)\n",
    "    \n",
    "    flag=0\n",
    "    \n",
    "    x = []\n",
    "    \n",
    "    while 1:\n",
    "        \n",
    "        base_lines = file_base.readlines(100000)\n",
    "             \n",
    "        if (not base_lines):\n",
    "            \n",
    "            break \n",
    "            \n",
    "        for base_line in base_lines:\n",
    "\n",
    "            if str(base_line).startswith(\"gc count:\"):\n",
    "                number = int(base_line.split()[2]) \n",
    "                x.append(number)\n",
    "\n",
    "    file_base.close()\n",
    "    \n",
    "    return x\n",
    "\n",
    "\n",
    "base = get_trace_reference(\"base_stat.txt\")\n",
    "gc = get_trace_reference(\"gc_stat.txt\")\n",
    "labels = [\"HM_0\",\"HM_1\",\"PRN_0\",\"PRN_1\",\"PROJ_1\",\"PROJ_3\",\"PROJ_4\",\"PRXY_0\"]\n",
    "x = np.arange(len(labels))  # the label locations\n",
    "width = 0.35  # the width of the bars\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "rects1 = ax.bar(x - width/2, base, width, label='BaseLine')\n",
    "rects2 = ax.bar(x + width/2, gc, width, label='LA-GC')\n",
    "\n",
    "# Add some text for labels, title and custom x-axis tick labels, etc.\n",
    "ax.set_ylabel('垃圾回收次数')\n",
    "ax.set_xticks(x)\n",
    "ax.set_xticklabels(labels)\n",
    "ax.legend()\n",
    "plt.savefig(\"gc_count.png\", bbox_inches = 'tight')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "e3ba364a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#输入SSDsim的输出文件 trace out\n",
    "#输出trace名字和相应的read latency\n",
    "import numpy as np\n",
    "import seaborn as sns\n",
    "import sys\n",
    "from openpyxl import Workbook\n",
    "from openpyxl.utils import get_column_letter\n",
    "import pandas as pd\n",
    "import scipy\n",
    "import os\n",
    "import sys\n",
    "import matplotlib.pyplot as plt\n",
    "from pylab import * \n",
    "import math\n",
    "from numpy import cumsum\n",
    "\n",
    "%matplotlib inline\n",
    "\n",
    "#数据输入\n",
    "def get_trace_reference(filename):\n",
    "    \n",
    "    file_base = open(filename)\n",
    "    \n",
    "    flag=0\n",
    "    \n",
    "    x = []\n",
    "    \n",
    "    while 1:\n",
    "        \n",
    "        base_lines = file_base.readlines(100000)\n",
    "             \n",
    "        if (not base_lines):\n",
    "            \n",
    "            break \n",
    "            \n",
    "        for base_line in base_lines:\n",
    "\n",
    "            if str(base_line).startswith(\"gc average page move count:  \"):\n",
    "                number = int(base_line.split()[5]) \n",
    "                x.append(number)\n",
    "\n",
    "    file_base.close()\n",
    "    \n",
    "    return x\n",
    "\n",
    "\n",
    "base = get_trace_reference(\"base_stat.txt\")\n",
    "gc = get_trace_reference(\"gc_stat.txt\")\n",
    "labels = [\"HM_0\",\"HM_1\",\"PRN_0\",\"PRN_1\",\"PROJ_1\",\"PROJ_3\",\"PROJ_4\",\"PRXY_0\"]\n",
    "x = np.arange(len(labels))  # the label locations\n",
    "width = 0.35  # the width of the bars\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "rects1 = ax.bar(x - width/2, base, width, label='BaseLine')\n",
    "rects2 = ax.bar(x + width/2, gc, width, label='LA-GC')\n",
    "\n",
    "# Add some text for labels, title and custom x-axis tick labels, etc.\n",
    "ax.set_ylabel('迁移页数')\n",
    "ax.set_xticks(x)\n",
    "ax.set_xticklabels(labels)\n",
    "ax.legend()\n",
    "plt.savefig(\"tranfer.png\", bbox_inches = 'tight')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "88d78efe",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
